package com.xiepei.day01;

import java.util.HashMap;
import java.util.Map;

/**
 * 第7课：泛型 + HashMap 基础
 *
 * 目标：
 * 1. 理解泛型 <K, V> 的含义，知道为什么 Map 需要两个类型。
 * 2. 掌握 HashMap 最常见的操作（put/get/remove/contains）。
 * 3. 学会遍历 Map（keySet、entrySet），并快速与前端对象字面量类比。
 *
 * 记忆口令：
 * - K (Key) 像 JS 对象里的属性名；
 * - V (Value) 像属性值；
 * - HashMap ≈ 无序对象；
 * - LinkedHashMap ≈ 按插入顺序记住键；
 * - TreeMap ≈ 按键排序。
 */
public class Lesson07_GenericsAndHashMap基础 {

    public static void main(String[] args) {
        explainGenericsQuickly();
        System.out.println();
        basicHashMapDemo();
        System.out.println();
        iterateMapDemo();
    }

    /**
     * 1. 泛型速通
     */
    private static void explainGenericsQuickly() {
        System.out.println("=== 泛型速通 ===");
        System.out.println("List<String> 表示：这个列表只能存 String");
        System.out.println("Map<String, Integer> 表示：key 是 String，value 是 Integer");
        System.out.println("好处：");
        System.out.println("  - 编译期就能发现类型错误");
        System.out.println("  - get 返回的类型确定，不用强转");
        System.out.println("  - IDE 提示更准确");
    }

    /**
     * 2. HashMap 基础操作
     */
    private static void basicHashMapDemo() {
        System.out.println("=== HashMap 核心 API ===");
        Map<String, Integer> ageMap = new HashMap<>();

        // put：添加或更新键值对
        ageMap.put("张三", 20);
        ageMap.put("李四", 22);
        ageMap.put("王五", 25);
        ageMap.put("张三", 21); // key 重复会覆盖
        System.out.println("添加后：" + ageMap); // {张三=21, 李四=22, 王五=25}

        // get：根据 key 取值，如果 key 不存在返回 null
        System.out.println("张三的年龄：" + ageMap.get("张三")); // 21
        System.out.println("赵六的年龄：" + ageMap.get("赵六")); // null

        // contains：判断是否存在 key / value
        System.out.println("是否包含 key '李四'：" + ageMap.containsKey("李四")); // true
        System.out.println("是否包含 value 25：" + ageMap.containsValue(25)); // true

        // remove：删除键值对，返回被删除的值
        Integer removed = ageMap.remove("王五");
        System.out.println("删除王五返回：" + removed); // 25
        System.out.println("删除后：" + ageMap); // {张三=21, 李四=22}
    }

    /**
     * 3. 遍历 Map
     */
    private static void iterateMapDemo() {
        System.out.println("=== 遍历 Map ===");
        Map<String, Integer> scoreMap = new HashMap<>();
        scoreMap.put("语文", 90);
        scoreMap.put("数学", 85);
        scoreMap.put("英语", 88);

        // 方式1：遍历 key，再通过 get 拿 value
        System.out.println("方式1：for-each keySet");
        for (String subject : scoreMap.keySet()) {
            Integer score = scoreMap.get(subject);
            System.out.println(subject + " -> " + score); // 顺序无保证
        }

        // 方式2：遍历 entry，直接同时拿 key 和 value（推荐）
        System.out.println("方式2：for-each entrySet（推荐）");
        for (Map.Entry<String, Integer> entry : scoreMap.entrySet()) {
            String subject = entry.getKey();
            Integer score = entry.getValue();
            System.out.println(subject + " => " + score);
        }

        // 方式3：lambda / forEach（了解）
        System.out.println("方式3：lambda forEach");
        scoreMap.forEach((subject, score) -> System.out.println(subject + " = " + score));
    }
}

